package fr.afcepf.atod21.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import fr.afcepf.atod21.entities.Organisme;
import fr.afcepf.atod21.entities.Stagiaire;
import fr.afcepf.atod21.exception.Atod21Expception;
/**
 * lkjdflk.
 * @author Stagiaire
 *
 */
public class DaoStagiaireImpl implements IDaoStagiaire {
    /**
     * DataSource pour l'acces a la BDD
     * 'organisme_formation'.
     */
    private Atod21DataSource ds = new Atod21DataSource();
    /**
     * Requette utilise par la methode ajouter afin d'ajouter un Stagiaire d'un la BDD
     * 'organisme_formation'.
     */
    private  String reqAjout = "INSERT INTO stagiaire (nom,prenom,date_naissance,adresse,id_organisme) VALUES "
            + "(?, ?, ?, ?, ?)";
    /**
     * Indice du parametre pour le nom du
     * {@link Stagiaire} dans la requette
     * {@link DaoStagiaireImpl#reqAjout}.
     */
    
    private final int indiceNomReqAjout = 1;
    /**
     * Indice du parametre pour le prenom du
     * {@link Stagiaire} dans la requette
     * {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indicePrenomReqAjout = 2;
    /**
     * Indice du parametre pour le date naissance du
     * {@link Stagiaire} dans la requette
     * {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indiceDateNaissanceReqAjout = 3;
    /**
     * Indice du parametre pour le adresse du
     * {@link Stagiaire} dans la requette
     * {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indiceAdresseReqAjout = 4;
    /**
     * Indice du parametre pour le organisme du
     * {@link Stagiaire} dans la requette
     * {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indiceOrganismeReqAjout = 5;
    @Override
    public List<Stagiaire> rechercher(String paramNom) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public List<Stagiaire> rechercher(int paramIdOrg) {
        // TODO Auto-generated method stub
        return null;
    }
    /**
     * Methode pour ajouter un {@link Stagiaire} a la BDD
     * 'organisme_formation'.
     */
    @Override
    public Stagiaire ajouter(Stagiaire paramStag) throws Atod21Expception {
        try {
            Connection cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqAjout, Statement.RETURN_GENERATED_KEYS);
            pstmt.setString(indiceNomReqAjout, paramStag.getNom());
            pstmt.setString(indicePrenomReqAjout, paramStag.getPrenom());
            pstmt.setDate(indiceDateNaissanceReqAjout, new java.sql.Date(paramStag.getDateNaissance().getTime()));
            pstmt.setString(indiceAdresseReqAjout, paramStag.getAdresse());
            if (paramStag.getOrganisme() != null && paramStag.getOrganisme().getId() != 0) {
                pstmt.setInt(indiceOrganismeReqAjout, paramStag.getOrganisme().getId());
            } else {
                pstmt.setNull(indiceOrganismeReqAjout, Types.INTEGER);
            }
            int resultSql = pstmt.executeUpdate();
            if (resultSql == 1) {
                ResultSet rs = pstmt.getGeneratedKeys();
                if (rs.next()) {
                    paramStag.setId(rs.getInt(1));
                }
            }
        } catch (SQLException e) {
            throw new Atod21Expception("Erreur 10001 - DaoStagiaireImpl Methode Ajouter " + e.getMessage());
        }
        return paramStag;
    }
    
    /**
     * Requette pour renvoier un {@link Stagiaire} d'un {@link Organisme} donnee dans la BDD
     * 'organisme_formation'.
     */
    private String reqRenvoi = "UPDATE stagiaire SET id_organisme = null WHERE idstagiaire = ? AND id_organisme=?";
    /**
     * Indice du parametre pour l'id du
     * {@link Stagiaire} dans la requette
     * {@link DaoStagiaireImpl#reqRenvoi}.
     */
    private final int indiceIdStagRenvoi = 1;
    /**
     * Indice du parametre pour l'id du
     * {@link Organisme} dans la requette
     * {@link DaoStagiaireImpl#reqRenvoi}.
     */
    private final int indiceIdOrganismeRenvoi = 2;
    /**
     * Methode qui exclue l'organisme d'un {@link Stagiaire} si celui ci match correctement.
     */
    @Override
    public Stagiaire renvoi(Stagiaire paramStag) throws Atod21Expception {
        Connection cnx;
        try {
            cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqRenvoi);
            pstmt.setInt(indiceIdStagRenvoi, paramStag.getId());
            pstmt.setInt(indiceIdOrganismeRenvoi, paramStag.getOrganisme().getId());
            if(pstmt.executeUpdate() == 1) {
                paramStag.setOrganisme(null);
            } else {
                throw new Atod21Expception("Erreur 10002 - DaoStagiaire Methode Renvoi "
                        + "Le Stagiaire n'est pas dans ce organisme.");
            }
        } catch (SQLException e) {
            throw new Atod21Expception("Erreur 10002 - DaoStagiaire Methode Renvoi " + e.getMessage());
        }
        return paramStag;
    }

}
